/**
 * \class AbsSyn.h /GenProg/AbsSyn/AbsSyn.h
 *
 *  \date 3 maj 2012
 *  \author ytc0039
 *  
 *  \brief Module class for abstract syntax tree
 *
 *  This is used to initialize the module.
 */

#ifndef ABSSYN_H_
#define ABSSYN_H_

#include <boost/shared_ptr.hpp>
#include <string>


using namespace std;

#define EXP_REGISTRY Registry<string,TerminalState,AbsSyn::IExpPtr>


class AddExp;
class ModulusExp;
class Assignment;
class BoolExp;
class BoolType;
class Declaration;
class DoubleExp;
class DoubleType;
class Ident;
class IdentExp;
class IExp;
class IExpVisitable;
class IntExp;
class IntType;
class IStmt;
class IStmtVisitable;
class IType;
class ITypeVisitable;
class StmtList;
class ExpRegistry;

class AbsSyn{
public:
	/**
	 * Using boost::shared_ptr for expression pointers
	 *
	 */
	typedef boost::shared_ptr< IExp > IExpPtr;

	/**
	 * Using boost::shared_ptr for Ident pointers
	 */
	typedef boost::shared_ptr< Ident > IdentPtr;



	/**
	 * \brief Constructor
	 *
	 * The constructor will create one instance
	 * of every expression and insert that into the register.
	 * This for the generators to be able to retrieve
	 * expressions that are available. So if you add a new
	 * expression this needs to be done. Example as follows
	 * for the int expression:
	 *
	 *
	 *
	 */
	AbsSyn(ExpRegistry& registry);

	/**
	 * \defgroup expFactory expression factories
	 */

	/**
	 * \ingroup expFactory
	 *
	 */

	~AbsSyn();
private:

};

/*
 *
 */

#endif /* ABSSYN_H_ */
